■ Xportによる PC(telnet)−PIC間通信
及び PIC − PIC間通信
<X Port 概要>
(1)全般
ネットワーク経由で簡単にハードウェアを制御できるコンポーネントとしてラントロニクス(LANTRONIX)社のネット
ワークユニット ”X Port”(エックスポートとよむ)があります。 XPortはイーサネットコネクタ(RJ45)、シリアルポート、
汎用I/Oポートを持ち、イーサネット信号とシリアル信号、汎用I/O信号を相互変換できる機能をもった
デバイスです。
デバイス自身が1つのURLをもつことから ”デバイス・サーバ”とも呼ばれています。 秋葉原の若松電商 などで
7000円/個 程度で購入することができます。
---------- XPort諸元(Xport-03)----------
・内臓プロセッサ …… DSTinEX
・シリアル通信速度 …… 300Kbps 〜 920Kbps
・電源電圧 …… 3.3V
・消費電流 …… 119mA(at Idle時)
〜240mA(通信時)
・シリアルデータ
IN …… VIL = 0 〜 0.8 V
VIH = 2.0V 〜5.5V
OUT …… VOL = max 0.4 V
VOH = min 2.4 V
・ 汎用I/O
IN …… VIL = 0 〜 0.8 V
VOH = min 2.4
V
OUT …… IOL = 4mA
IOH = 4mA
【XPortに関する技術資料】
★鞄新システムズ
★LANTRONIX社
(1) XportによるPC(telnet)−PIC間通信
<試作品仕様>
・ PCのキーボードから入力した文字を液晶の1行目に ” Input=文字 ”と表示する
・ PCのキーボードから入力した文字と入力した文字のアスキーコードで次の文字と入力した文字のアスキーコードで
次の次の文字を2行目に PIC has send の後に表示する。
<例> 入力文字が B の場合
1行目 Input=B
2行目 PIC has send BCD
・ PCのDOS窓に 入力した文字とPICから送信されてきた文字を表示する。
<回路図>
・ PIC18F452をつかった場合の回路図を以下に示します。(→回路図のPDFファイル )
・ XportとPIC間の通信は ハード的な電圧レベルを除いてRS232Cに準拠した通信です。
( 通信速度:9600bps データビット:8 ストップビット:1 パリティ:なし フロー制御:なし)
( XportのVOHはmin 2.4Vで、PICは2.0V以上がHなので レベルシフトなしで直結しました)
・ 下記回路はXport通信時約240mAという大電流を電源から消費します。3端子レギュレータなどで
電源を設計する場合は冷却フィン取り付け、分圧などをおこない熱破壊のないように気をつけ
ましょう。
★ ハブ+ルータを除いてPCとXportをクロスケーブルで直結しても動作しました。この場合PCのDHCP(Dynamic Host
Configuration Protocol)機能はOFFとして手動でURLを設定する必要があります。
<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
以下のプログラム例の中にある液晶表示器制御ライブラリ 1llcd_lib.cは 後閑哲也さんが設計されたものです |
<プログラム例> //-------------------------------------- // 構成 // telnet(PC) → Xport(LAN) → PIC18F452→ 16文字キャラクタ液晶 #include "18f452.h" #use delay(clock=40000000) #FUSES EC,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) // TX=RC6,RX=RC7 //////// Port define and link LCD library #define mode 0 // No1 液晶 #define input_x input_D #define output_x output_D #define set_tris_x set_tris_D #define rs PIN_D2 //chip select #define stb PIN_D0 //strobe #include <1lcd_lib.c> main(){ char cmnd; set_tris_c(0b10010000);// 必須 in = RC7 & RC4 lcd_init(); lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); printf(lcd_data,"telnet to PIC !!"); delay_ms(1000); // while(1){ printf("\r\nCommand = "); //message cmnd = getc(); // PCのキーボードからの入力を待つ printf(" :(character from PC to PC via telnet and Xport)"); printf("\r\nResponse = "); putc(cmnd); // PC側へ受信した文字を送信する putc(cmnd + 0x01); //PC側へ受信した文字の次のアスキーコード文字を送信する putc(cmnd + 0x02); //PC側へ受信した文字の次の次のアスキーコード文字を送信する printf(" :(characters from PIC to PC via telnet and Xport)\r\n"); lcd_clear(); printf(lcd_data,"Input=%c",cmnd); //液晶の1行目に受信した文字を表示する lcd_cmd(0xC0); // 2行目の先頭へ printf(lcd_data,"PIC has send %c%c%c",cmnd,cmnd + 0x01,cmnd + 0x02); // 送信した文字を液晶の2行目に表示する } return 0; } //************************************** //インクルードファイル 1lcd_lib.c //このファイルは後閑哲也さんが設計されたものです //************************************** /////////////////////////////////////////////// // 液晶表示器制御ライブラリ // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 //////// データ出力サブ関数 void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(4); //NOP 1 output_high(stb); //strobe out delay_cycles(8); //NOP 2 output_low(stb); //reset strobe } //////// 1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } /////// 全消去関数 void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } /////// 初期化関数 void lcd_init() { set_tris_x(mode); //モードセット delay_ms(15); lcd_out(0x30, 1); //8bit mode set delay_ms(5); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x20, 1); //4bit mode set delay_ms(1); lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //display off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 lcd_cmd(0x02); //cursor home }
<動作手順>
@ LANTRONIX社のHPから DeviceInstallerと云うソフトをダウンロードしてPCへインストールします。
A PCとLANケーブルで上記の制御キバンをつなぎ通電した状態でDeviceInstallerを起動します。
正常であればアイコンのSearchをクリックすると下記のようにXportのIPアドレスが表示されます。
以下は、 IPアドレス、ポート番号を下記として設定し、通信をした場合のものです。
IPアドレス
ポート番号:
PC
192.168.0.2 3001
Xport 192.168.0.44
14001
B DeviceInstallerから Xportにたいして下記の画面などで所要の設定をおこないます。
C DOSのコマンドラインから XportのIPアドレス、ポート番号を指定してtelnet接続をおこないます。
Dキーボードから文字を送ります。 下記のような表示があらわれます。
以下は ”B” のあとに ”2” をキーインした時のものです。
E また 液晶には下記のような表示があらわれます。
以下は PCから ”B”をキーインした時のものです。
PCを介さないでXportをインターフェースとして2つのPICをハブ+ルーターにつなぎ通信をおこなった例を紹介します
<試作品の仕様>
★送信側PIC
・200msec毎に0〜255までの整数を生成し 受信側PICにXport経由で送信する
・生成した整数はアスキー文字でで液晶に表示する
★受信側PIC
・Xport経由で受信したデータをアスキー文字で1段目左から順次ならべて表示する。
・上段の行がいっぱいになったら下段に表示する。下段も文字がいっぱいなったらすべての文字を消去してまた
上段の左から順次ならべて表示する。
<回路図>(→回路図のPDFファイル)
・ 送信側と受信側の回路は同じです
・ ハブとルータを省略してクロスのLANケーブルで直接Xport同士を接続しても動作します。 クロスのLANケーブルは
秋葉原(ラジオセンタ)のミマツ音響などで10分程度待っていれば好みの長さでつくってくれます。
<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
以下のプログラム例の中にある液晶表示器制御ライブラリ 1llcd_lib.cは 後閑哲也さんが設計されたものです
<プログラム例> //*************************** // <送信側> //***************************
//-------------------------------------- // 構成 // PIC18F452 → Xport(LAN) → Xport(LAN) → PIC18F452 → 16文字キャラクタ液晶 // IP_address 192.168.0.44 192.168.0.55 // Port(ch) 10001 10001 // Remote IP address 192.168.0.55 192.168.0.44 // Port(ch) 10001 10001 // ConnectMode 0xC1 0xC1 (サーバ、クライアント両機能ON) // 9600bps フロー制御なし スタートビット1 パリティなし #include "18f452.h" #use delay(clock=40000000) #FUSES EC,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) // TX=RC6,RX=RC7 //////// Port define and link LCD library #define mode 0 // No1 液晶 #define input_x input_D #define output_x output_D #define set_tris_x set_tris_D #define rs PIN_D2 //chip select #define stb PIN_D0 //strobe #include <1lcd_lib.c> main(){ int cmnd,res_cmnd; unsigned int i,j; set_tris_c(0b10010000);// 必須 in = RC7 & RC4 lcd_init(); lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); printf(lcd_data,"PIC to PIC !!"); while(1){ i =0; for(i = 0; i < 255; i++) { cmnd = i; putc(cmnd); lcd_clear(); printf(lcd_data,"SendData=%c",cmnd); //液晶の1行目に送信したアスキー文字をを表示する delay_ms(200); } } return 0; } //--------------------------------------------------------------------------- //************************************** //インクルードファイル 1lcd_lib.c //このファイルは後閑哲也さんが設計されたものです //************************************** /////////////////////////////////////////////// // 液晶表示器制御ライブラリ // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 //////// データ出力サブ関数 void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(4); //NOP 1 output_high(stb); //strobe out delay_cycles(8); //NOP 2 output_low(stb); //reset strobe } //////// 1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } /////// 全消去関数 void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } /////// 初期化関数 void lcd_init() { set_tris_x(mode); //モードセット delay_ms(15); lcd_out(0x30, 1); //8bit mode set delay_ms(5); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x20, 1); //4bit mode set delay_ms(1); lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //display off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 lcd_cmd(0x02); //cursor home } //--------------------------------------------------------------------------------- //*********************** // <受信側> //*********************** #include <18F452.h> #use delay(clock=40000000) #FUSES EC,WDT64,PUT,BROWNOUT,BORV42,NOPROTECT,NOLVP // WDT = 18msec × 64 = 1152 msec #use RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) // TX=RC6,RX=RC7 #use fast_io(B) #use fast_io(D) //////// Port define and link LCD library #define mode 0 // No1 液晶 #define input_x input_D #define output_x output_D #define set_tris_x set_tris_D #define rs PIN_D2 //chip select #define stb PIN_D0 //strobe #include "1lcd_lib.c" char cmnd; main() { int i = 0; lcd_init(); lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF lcd_clear(); printf(lcd_data,"PIC to PIC"); lcd_cmd(0xC0); // 2行目の先頭へ printf(lcd_data,"Start !!"); while(1){ cmnd = getc();//コマンド受信 restart_wdt(); i++; if(i == 16)lcd_cmd(0xC0); // 2行目の先頭へ if(i >=32) { lcd_cmd(0x01); // 全消去 i = 0; } lcd_data(cmnd);// 文字表示 } return 0; } //--------------------------------------------------------------------------- //************************************** //インクルードファイル 1lcd_lib.c //このファイルは後閑哲也さんが設計されたものです //************************************** /////////////////////////////////////////////// // 液晶表示器制御ライブラリ // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 //////// データ出力サブ関数 void lcd_out(int code, int flag) { output_x((code & 0xF0) | (input_x() & 0x0F)); if (flag == 0) output_high(rs); //表示データの場合 else output_low(rs); //コマンドデータの場合 delay_cycles(4); //NOP 1 output_high(stb); //strobe out delay_cycles(8); //NOP 2 output_low(stb); //reset strobe } //////// 1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } /////// 全消去関数 void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } /////// 初期化関数 void lcd_init() { set_tris_x(mode); //モードセット delay_ms(15); lcd_out(0x30, 1); //8bit mode set delay_ms(5); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x30, 1); //8bit mode set delay_ms(1); lcd_out(0x20, 1); //4bit mode set delay_ms(1); lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //display off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 lcd_cmd(0x02); //cursor home }
<動作手順>
@ LANTRONIX社のHPから DeviceInstallerと云うソフトをダウンロードしてPCへインストールします。
A PCもLANケーブルでハブにつなぎます。上記の制御キバンをつなぎ通電した状態でDeviceInstallerを起動します。
正常であればアイコンのSearchをクリックすると下記のようにXportのIPアドレスが表示されます。
B 2つのXportのIPアドレスをネットワークにつながっているPCやプリンタなどのIPアドレスととバッティングしないように
設定します。
尚、本試作品では以下のIPアドレス、ポート番号で動作させています。
送信側 Xport
IP アドレス 192.168.0.44
Port番号 10001
受信側 Xport
IPアドレス 192.168.0.55
Port番号 10001
C 次にポートのプロパティを以下のように設定します
送信側 Xport | 受信側 Xport | |
Dつづいて デバイスのコンフィギュレーションを以下のように設定します。送信側と受信側は全く同じです。
E以上の設定後、動作させると以下の表示が液晶画面にあらわれます。
画面は” ] ”( 0x5D )が送信された直後の液晶画面です。